package bfw3b9.atprin.Interface;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.Log;
import android.view.MotionEvent;

/**
 * Die eigene SurfaceView-Klasse Das ist fuer die eigentliche Grafikdarstellung
 * nicht noetig. Diese Klasse wird aber gebraucht, wenn wir z.B. Touch-Events
 * abfangen wollen, da Sie erweitert werden kann.
 * 
 * @author Thomas Rinsch
 * 
 */
class InterfaceView extends GLSurfaceView
{

	private final String LOGTAG = "InterfaceView";
	private InterfaceRenderer mRenderer;
	private InterfaceController mController;
	private InterfaceMenu mMenu;

	/**
	 * Konstruktor Erzeugt ebenfalls einen neuen Renderer
	 * 
	 * @param context
	 */
	public InterfaceView(InterfaceController context)
	{
		super( (Context) context );
		Log.d( LOGTAG, "Konstruktor aufgerufen" );
		mController = context;

		// Der GL-Factory mitteilen, dass wir OpenGL-ES 2 benutzen
		setEGLContextClientVersion( 2 );
		// Die einzelnen Bittiefen pro Kanal (RGBA, Depth, Stencil) setzen
		setEGLConfigChooser( 8, 8, 8, 8, 16, 8 );

		// Den Renderer auswaehlen
		mRenderer = new InterfaceRenderer( mController, mController.getItems() );
		setRenderer( mRenderer );

		// Das Menue erstellen
		mMenu = new InterfaceMenu( mController.getItems() );

		// Folgendes hilft Energie sparen:
		// Nur rendern, wenn sich etwas aendert!
		setRenderMode( GLSurfaceView.RENDERMODE_WHEN_DIRTY );
		Log.d( LOGTAG, "Konstruktor erfolgreich" );
	}

	/**
	 * Am Beruehrungspunkt soll das Menue geoeffnet werden
	 */
	@Override
	public boolean onTouchEvent(MotionEvent e)
	{

		/*
		 * Normalisierung der Touch-Koordinaten in den OpenGL-Workspace
		 * 
		 * Der OpenGL-Workspace reicht von x[-ratio*Orthoscale | +ratio*Orthoscale]
		 * und y[-1*Orthoscale | +1*Orthoscale]
		 * 
		 * Da das eigentliche Color-picking auf einem Framebuffer, also
		 * quasi einem Bild stattfindet, muessen fuer diesen Zweck auch die Original
		 * Touch-Koordinaten des Fensters erhalten bleiben!
		 */
		float ratio = mRenderer.getRatio();
		float width = getWidth() / 2;
		float height = getHeight() / 2;
		float x = ( ( ( e.getX() - width ) / width ) * ( mRenderer.getOrthoscale() ) ) * ratio;
		float y = ( ( height - e.getY() ) / height ) * mRenderer.getOrthoscale();
		Log.d( LOGTAG, "Bildschirm beruehrt bei X: " + e.getX() + " Y: " + e.getY() );
		mRenderer.prepareTouch( (int) e.getX(), (int) e.getY() ); // Colorpicking

		mMenu.openMenu( x, y );
		mRenderer.setItems( mMenu.getMenu() );

		requestRender();

		return true;
	}

}